package com.hzhc.utils;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/*
 * @author benkwok
 * @Date 2019/6/27 
 * @Description 集装箱校验工具类
 * 来源https://blog.csdn.net/benkwok/article/details/54971387 
 * 
 */
public class CheckUtils {
	public static boolean checkDigit(String containerNumber) throws Exception {
		if(!Pattern.compile("[A-Z]*").matcher(containerNumber.substring(0,4)).matches()){
			System.err.println("前4位必须是大些字母");
			return false;
		}
		if (containerNumber == null || containerNumber.trim().length() != 11) {
			System.err.println("Not a container number");
			return false;
		}
		Map<String, Integer> mapofCode = new HashMap<String, Integer>();
		mapofCode.put("A", 10);
		mapofCode.put("B", 12);
		mapofCode.put("C", 13);
		mapofCode.put("D", 14);
		mapofCode.put("E", 15);
		mapofCode.put("F", 16);
		mapofCode.put("G", 17);
		mapofCode.put("H", 18);
		mapofCode.put("I", 19);
		mapofCode.put("J", 20);
		mapofCode.put("K", 21);
		mapofCode.put("L", 23);
		mapofCode.put("M", 24);
		mapofCode.put("N", 25);
		mapofCode.put("O", 26);
		mapofCode.put("P", 27);
		mapofCode.put("Q", 28);
		mapofCode.put("R", 29);
		mapofCode.put("S", 30);
		mapofCode.put("T", 31);
		mapofCode.put("U", 32);
		mapofCode.put("V", 34);
		mapofCode.put("W", 35);
		mapofCode.put("X", 36);
		mapofCode.put("Y", 37);
		mapofCode.put("Z", 38);
        int positon = 1;
		int sum = 0;
		for (int i = 0; i < containerNumber.length() - 1; i++) {
			if (mapofCode.containsKey(containerNumber.substring(i, i + 1))) {
				sum += (int) (Double.valueOf(mapofCode.get(containerNumber.substring(i, i + 1))) * Math.pow(2, positon - 1));
			} else {
				sum += (int) (Double.parseDouble(containerNumber.substring(i, i + 1)) * Math.pow(2, positon - 1));
			}
			positon++;
		}
		int checkdigit = sum % 11 % 10;
		System.out.println("check container number:" + containerNumber + ";get check digit is " + checkdigit
				+ ";origin check digit is "
				+ containerNumber.substring(containerNumber.length() - 1));
        return checkdigit == Integer
				.parseInt(containerNumber.substring(containerNumber.length() - 1));
	}

	public static boolean checkCntrNo(String cntrNo){
		if (cntrNo == null || cntrNo.trim().length() != 11) {
			return false;
		}
		if(!Pattern.compile("[A-Z]*").matcher(cntrNo.substring(0,4)).matches()){
			return false;
		}
		return Pattern.matches("\\d+", cntrNo.substring(4, 10));
	}

	public static boolean isMobileNO(String mobiles) {
		Pattern p = Pattern.compile("^((13[0-9])|(14[5,7])|(15[^4,\\D])|(17[0,1,3,5-8])|(18[0-9])|166|198|199)\\d{8}$");
		Matcher m = p.matcher(mobiles);
		return m.matches();
	}
}
